package com.shiyi.design.prototype;

/**
 * 原型模式（prototype）：通过原型自我复制完成对象的创建。
 *
 * @author wangzhanshuai
 * @date 2021/1/25 9:50 下午
 * @since 1.0
 */
public class Client {

    public static void main(String[] args) {
        //有一只羊，名字叫做tom，年龄1岁，白色，要求完成创建十只一摸一样的羊
        Sheep sheep = new Sheep("tom", 1, "white");
        sheep.setFriend(new Sheep("jack", 2, "black"));
        // 传统方式
//        traditionMethod(sheep);

        // 使用原型模式（浅拷贝）
//        prototypeMethod(sheep);

        // 使用原型模式（深拷贝1）
//        prototypeDeepCloneMethod1(sheep);

        // 使用原型模式（深拷贝2）
        prototypeDeepCloneMethod2(sheep);
    }

    private static void prototypeDeepCloneMethod2(Sheep sheep) {
        System.out.println(sheep.getFriend().hashCode());
        for (int i = 0; i < 10; i++) {
            Sheep deepClone1 = sheep.deepClone2();
            System.out.println(deepClone1.getFriend().hashCode());
        }
    }

    /**
     * 原型模式（深拷贝1）
     * @param sheep
     */
    private static void prototypeDeepCloneMethod1(Sheep sheep) {
        System.out.println(sheep.getFriend().hashCode());
        for (int i = 0; i < 10; i++) {
            Sheep deepClone1 = sheep.deepClone1();
            System.out.println(deepClone1.getFriend().hashCode());
        }
    }

    /**
     * 原型模式（浅拷贝）
     * @param sheep
     */
    private static void prototypeMethod(Sheep sheep) {
        for (int i = 0; i < 10; i++) {
            Sheep cloneSheep = sheep.clone();
            System.out.println(cloneSheep);
        }
    }

    /**
     * 如果采用传统的方式，则需要new十次Sheep对象，然后将tom的属性传入，
     * 但是这样的方式，如果新增了属性，那么需要修改，如果调用的地方很多，那么改动的地方也变多了。
     * @param sheep
     */
    private static void traditionMethod(Sheep sheep) {
        for (int i = 0; i < 10; i++) {
            Sheep cloneSheep = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
            System.out.println(cloneSheep);
        }
    }
}
